package com.weixin.engine.daily.guava;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

public class Main {

    public static final Map<Integer, String> TEST_DATA_MAP = Maps.newHashMap();

    static {
        TEST_DATA_MAP.put(1, "张三");
        TEST_DATA_MAP.put(2, "里斯");
        TEST_DATA_MAP.put(3, "王五");
        TEST_DATA_MAP.put(4, "赵六");
    }

//    public static void main(String[] args) {
//        LoadingCache<Integer, String> cache = CacheBuilder.newBuilder()
//                //缓存存储最大数量
//                .maximumSize(3)
//                //访问过期时间3s
//                .expireAfterAccess(3, TimeUnit.SECONDS)
//                .build(new CacheLoader<Integer, String>() {
//                    @Override
//                    public String load(Integer key) throws Exception {
//                        //当缓存不存在时能够自动加载数据到缓存中
//                        return TEST_DATA_MAP.get(key);
//                    }
//                });
//
//        try {
//            Thread.sleep(4000);
//            System.out.println(cache.get(1));
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

//    public static void main(String[] args) {
//        LoadingCache<Integer, String> cache = CacheBuilder.newBuilder()
//                //缓存存储最大数量
//                .maximumSize(3)
//                //访问过期时间3s
//                .expireAfterAccess(3, TimeUnit.SECONDS)
//                //监听删除
//                .removalListener(notification -> System.out.println("删除监听：" + notification.getKey() + "=" + notification.getCause()))
//                .build(new CacheLoader<Integer, String>() {
//                    @Override
//                    public String load(Integer key) throws Exception {
//                        //当缓存不存在时能够自动加载数据到缓存中
//                        return TEST_DATA_MAP.get(key);
//                    }
//                });
//
//        try {
//            cache.get(1);
//            Thread.sleep(3000);
//            printAll(cache);
//
//            cache.get(1);
//            cache.get(2);
//            cache.get(3);
//            cache.get(4);
//
//            cache.invalidate(3);
//            printAll(cache);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

    public static void main(String[] args) throws ExecutionException {
//        Cache<Integer, String> cache = CacheBuilder.newBuilder().build();
//        cache.put(1, "a");
//        cache.put(2, "b");
//
//        System.out.println(cache.getIfPresent(1));
//        System.out.println(cache.getIfPresent(2));
//        System.out.println(cache.getIfPresent(3));

//        LoadingCache<Integer, String> cache1 = CacheBuilder.newBuilder()
//                .build(new CacheLoader<Integer, String>() {
//                    @Override
//                    public String load(Integer key) throws Exception {
//                        return "helloKey" + key;
//                    }
//                });
//        cache1.put(1,"a");
//        System.out.println(cache1.get(1));
//        System.out.println(cache1.get(2));
//        System.out.println(cache1.get(3));
//
//        List<Integer> list = new ArrayList<Integer>() {
//            {
//                add(1);
//                add(2);
//            }
//        };
//        ImmutableMap<Integer, String> map = cache1.getAll(list);
//        System.out.println(map);


//        Cache<Object, Object> cache2 = CacheBuilder.newBuilder().build();
//        cache2.put(1, "a");
//        System.out.println(cache2.getIfPresent(1));
//
//        cache2.put(2, "b");
//        Object o = cache2.get(2, () -> "5656");
//        System.out.println(o);

        Cache<Integer, String> cache1 = CacheBuilder.newBuilder()
                .maximumSize(2)
                .build();
        cache1.put(1, "a");
        cache1.put(2, "b");
        cache1.put(3, "c");
        System.out.println(cache1.asMap());
        System.out.println(cache1.getIfPresent(2));
        cache1.put(4, "d");
        System.out.println(cache1.asMap());

    }


    /**
     * 输出
     *
     * @param cache
     */
    public static void printAll(LoadingCache cache) {
        System.out.println("输出全部");
        Iterator iterator = cache.asMap().entrySet().iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next().toString());
        }
    }
}